package br.com.viewcar.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SecondaryTable;
import javax.persistence.SecondaryTables;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Type;

import com.vividsolutions.jts.geom.Point;

@Entity
@SecondaryTables({
	@SecondaryTable(name="ULTIMA_TRANSMISSAO", schema = "CHECKROTA")
})
@Table(name = "VEICULO", schema = "CHECKROTA")
@NamedQueries({
	@NamedQuery(name = "Veiculo.findByPlaca", query = "SELECT v FROM Veiculo v WHERE v.cliente.id = ? AND v.placa = ?"),
	@NamedQuery(name = "Veiculo.findByCliente", query = "SELECT v FROM Veiculo v WHERE v.cliente.id = ?"),
	@NamedQuery(name = "Veiculo.findBySerial", query = "SELECT v FROM Veiculo v WHERE v.numeroSerial = ? and v.id <> ?"),
	@NamedQuery(name = "Veiculo.findByClienteMonitoramento", query = "SELECT v FROM Veiculo v WHERE v.cliente.id = ? and v.nome LIKE ?"),

})
public class Veiculo implements Serializable {

	private static final long serialVersionUID = 8385633292021681817L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="SEQ_VEICULO", nullable = false)
	private Integer id;

	@Column(name="COD_EXTERNO", nullable = false)
	private Integer codigoExterno;

	@Column(name="NUM_SERIAL", nullable = false)
	private Integer numeroSerial;

	@Temporal(TemporalType.DATE)
	@Column(name="DAT_VEICULO")
	private Date dataCadastro;

	@Column(name="DSC_VEICULO", nullable = false, length = 30)
	private String nome;

	@Column(name="DSC_PLACA", nullable = false, length = 8)
	private String placa;

	@Column(name="DSC_CHASSI", length = 17)
	private String chassi;

	@Column(name="NUM_ANO", length = 4)
	private Integer ano;

	@Column(name="NUM_ANO_MODELO", length = 4)
	private Integer anoModelo;

	@Column(name="NUM_RENAVAM", length = 10)
	private String renavan;

	@Column(name="DSC_COR", length = 20)
	private String cor;

	@ManyToOne
	@JoinColumn(name="SEQ_CLIENTE")
	private Cliente cliente;

	@ManyToOne
	@JoinColumn(name="SEQ_EQUIPAMENTO")
	private Equipamento equipamento;

	@ManyToOne
	@JoinColumn(name="SEQ_MARCA")
	private Marca marca;

	@ManyToOne
	@JoinColumn(name="SEQ_MODELO")
	private Modelo modelo;

//	@ManyToMany(cascade = CascadeType.ALL)
//	@JoinTable(name = "VEICULO_AREA", schema = "VIEWCAR", 
//			joinColumns=@JoinColumn(name="ID_VEICULO"), inverseJoinColumns=@JoinColumn(name="ID_AREA"))
//	private List<Area> areas;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="DAT_TRANSMISSAO", table = "ULTIMA_TRANSMISSAO")
	private Date dataTransmissao;

	@Column(name="NUM_DIST_PONTO", table = "ULTIMA_TRANSMISSAO")
	private Float distancia;

	@Column(name="STA_PANICO", table = "ULTIMA_TRANSMISSAO")
	private Boolean statusPanico;

	@Column(name="STA_IGNICAO", table = "ULTIMA_TRANSMISSAO")
	private Boolean statusIgnicao;

	@Column(name="STA_ENTRADA_2", table = "ULTIMA_TRANSMISSAO")
	private Boolean statusEntrada2;

	@Column(name="STA_ENTRADA_3", table = "ULTIMA_TRANSMISSAO")
	private Boolean statusEntrada3;

	@Column(name="STA_ENTRADA_4", table = "ULTIMA_TRANSMISSAO")
	private Boolean statusEntrada4;

	@Column(name="NUM_ENTRADA_2", table = "ULTIMA_TRANSMISSAO")
	private Short valorEntrada2;

	@Column(name="NUM_ENTRADA_3", table = "ULTIMA_TRANSMISSAO")
	private Short valorEntrada3;

	@Column(name="NUM_ENTRADA_4", table = "ULTIMA_TRANSMISSAO")
	private Short valorEntrada4;

	@Column(name="NUM_VELOCIDADE", table = "ULTIMA_TRANSMISSAO")
	private Float velocidade;

	@Column(name="NUM_TEMPERATURA", table = "ULTIMA_TRANSMISSAO")
	private Float temperatura;

	@Column(name="NUM_ODOMETRO", table = "ULTIMA_TRANSMISSAO")
	private Float odometro;

	@ManyToOne
	@JoinColumn(name="SEQ_PONTO", table = "ULTIMA_TRANSMISSAO")
	private Ponto ponto;
	
	@Column(name="GEO_PONTO", table = "ULTIMA_TRANSMISSAO")
	@Type(type="org.hibernatespatial.GeometryUserType")
	private Point geometry;


	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getCodigoExterno() {
		return codigoExterno;
	}

	public void setCodigoExterno(Integer codigoExterno) {
		this.codigoExterno = codigoExterno;
	}

	public Integer getNumeroSerial() {
		return numeroSerial;
	}

	public void setNumeroSerial(Integer numeroSerial) {
		this.numeroSerial = numeroSerial;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getPlaca() {
		return placa;
	}

	public void setPlaca(String placa) {
		this.placa = placa;
	}

	public String getChassi() {
		return chassi;
	}

	public void setChassi(String chassi) {
		this.chassi = chassi;
	}

	public Integer getAno() {
		return ano;
	}

	public void setAno(Integer ano) {
		this.ano = ano;
	}

	public String getCor() {
		return cor;
	}

	public void setCor(String cor) {
		this.cor = cor;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Equipamento getEquipamento() {
		return equipamento;
	}

	public void setEquipamento(Equipamento equipamento) {
		this.equipamento = equipamento;
	}

//	public List<Area> getAreas() {
//		return areas;
//	}
//
//	public void setAreas(List<Area> areas) {
//		this.areas = areas;
//	}

	public Point getGeometry() {
		return geometry;
	}

	public void setGeometry(Point geometry) {
		this.geometry = geometry;
	}

	public Date getDataTransmissao() {
		return dataTransmissao;
	}

	public void setDataTransmissao(Date dataTransmissao) {
		this.dataTransmissao = dataTransmissao;
	}

	public Float getDistancia() {
		return distancia;
	}

	public void setDistancia(Float distancia) {
		this.distancia = distancia;
	}

	public Boolean getStatusPanico() {
		return statusPanico;
	}

	public void setStatusPanico(Boolean statusPanico) {
		this.statusPanico = statusPanico;
	}

	public Boolean getStatusIgnicao() {
		return statusIgnicao;
	}

	public void setStatusIgnicao(Boolean statusIgnicao) {
		this.statusIgnicao = statusIgnicao;
	}

	public Boolean getStatusEntrada2() {
		return statusEntrada2;
	}

	public void setStatusEntrada2(Boolean statusEntrada2) {
		this.statusEntrada2 = statusEntrada2;
	}

	public Boolean getStatusEntrada3() {
		return statusEntrada3;
	}

	public void setStatusEntrada3(Boolean statusEntrada3) {
		this.statusEntrada3 = statusEntrada3;
	}

	public Boolean getStatusEntrada4() {
		return statusEntrada4;
	}

	public void setStatusEntrada4(Boolean statusEntrada4) {
		this.statusEntrada4 = statusEntrada4;
	}

	public Short getValorEntrada2() {
		return valorEntrada2;
	}

	public void setValorEntrada2(Short valorEntrada2) {
		this.valorEntrada2 = valorEntrada2;
	}

	public Short getValorEntrada3() {
		return valorEntrada3;
	}

	public void setValorEntrada3(Short valorEntrada3) {
		this.valorEntrada3 = valorEntrada3;
	}

	public Short getValorEntrada4() {
		return valorEntrada4;
	}

	public void setValorEntrada4(Short valorEntrada4) {
		this.valorEntrada4 = valorEntrada4;
	}

	public Float getVelocidade() {
		return velocidade;
	}

	public void setVelocidade(Float velocidade) {
		this.velocidade = velocidade;
	}

	public Float getTemperatura() {
		return temperatura;
	}

	public void setTemperatura(Float temperatura) {
		this.temperatura = temperatura;
	}

	public Float getOdometro() {
		return odometro;
	}

	public void setOdometro(Float odometro) {
		this.odometro = odometro;
	}

	public Ponto getPonto() {
		return ponto;
	}

	public void setPonto(Ponto ponto) {
		this.ponto = ponto;
	}

	public Integer getAnoModelo() {
		return anoModelo;
	}

	public void setAnoModelo(Integer anoModelo) {
		this.anoModelo = anoModelo;
	}

	public String getRenavan() {
		return renavan;
	}

	public void setRenavan(String renavan) {
		this.renavan = renavan;
	}

	public Marca getMarca() {
		return marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}

	public Modelo getModelo() {
		return modelo;
	}

	public void setModelo(Modelo modelo) {
		this.modelo = modelo;
	}

	public int hashCode() {

		int result = 1;
		result = 31 * result + ((id == null) ? 0 : id.hashCode());
		result = 31 * result + ((nome == null) ? 0 : nome.hashCode());

		return result;
	}

	public boolean equals(Object obj) {

		if (this == obj)
			return true;

		if (obj == null)
			return false;

		if (getClass() != obj.getClass())
			return false;

		Veiculo other = (Veiculo) obj;

		return ((id == null && other.id == null) || (id != null && id.equals(other.id))) &&
		((nome == null && other.nome == null) || (nome != null && nome.equals(other.nome)));
	}
}